<?php

/**
 * GenProg Interfaz Grafica de Usuario
 *
 *
 * @author      Carlos Peña <crash.madover@gmail.com>
 * @package     application.libraries.orm.gpql
 * @copyright   (c) 2013, GenProg
 * @version     v 1.0
 */
class GUI {

  public static $instancia = null;

  // --------------------------------------------------------------------------

  /**
   * @var string Hoja de Estilo
   */
  public $css = '';

  // --------------------------------------------------------------------------

  /**
   * @var string JavaScript
   */
  public $js = '';

  // --------------------------------------------------------------------------

  /**
   * @var type array Arreglos JavaScript
   */
  public $json = array();

  // --------------------------------------------------------------------------

  /**
   * @var type array
   */
  public $php = array();

  // --------------------------------------------------------------------------

  /**
   * @var type int
   */
  private $param = 0;

  // --------------------------------------------------------------------------

  /**
   * Clase por arreglos
   * @var type int
   */
  private $obj = 0;
  // --------------------------------------------------------------------------

  private $db = null;
  private $orden = 1;
  private $Modelo = '';

  /**
   * @var string Arreglo de Combos
   */
  private $combo = 1;

  // --------------------------------------------------------------------------

  /**
   * Constructor de la Clase
   *
   * @access      public
   */
  public function __construct($sModelo = '', $DB = null) {
    $this->Modelo = $sModelo;
    $this->db = $DB;
  }

  // --------------------------------------------------------------------------

  /**
   * Obtener Instancia de la Clase Patrones
   *
   * @param       string      Consulta o Modelo
   * @param       object      Clase
   * @return      class
   */
  public static function Cargar($sModelo = '', $DB = null) {
    if (self::$instancia instanceof GUI) {
      
    } else {

      self::$instancia = new GUI($sModelo, $DB);
    }
    return self::$instancia;
  }

  // --------------------------------------------------------------------------

  /**
   * Funcion Para Generar Arreglos PHP y JSon
   *
   * @access      public
   * @param       string Prefijo de Creacion
   * @param       object Forma Modelo
   * @return boolean
   */
  public function Generar($sModelo = '', $bUnico = FALSE) {
    //Creando la instancia de un Objeto Generico
    $Class = strtolower($sModelo);
    include_once (APPPATH . 'models/' . MODEL . $Class . '.php');
    $MObjeto = new $Class();

    $sPre = $MObjeto->prefijo . '_';

    //Leer Campos Recursivamente
    foreach ($MObjeto->struc['cmp'] as $sC => $sV) {
      $arr = array();

      if (isset($sV['union'])) {
        $Class = strtolower($sV['union']);
        include_once (APPPATH . 'models/' . MODEL . $Class . '.php');
        $lst = new $Class();
        $rs = $this->db->query('SELECT * FROM ' . $lst->tabla);
        foreach ($rs->result() as $Rs) {
          $clave = $lst->prefijo . '_oid';
          $valor = $lst->prefijo . '_nomb';
          $arr[$Rs->$clave] = $Rs->$valor;
        }

        //echo $lst;
      }

      if (isset($sV['combo'])) {
        $arr = $MObjeto->$sV['combo'];
      }

      $sTipo = $this->Definir_Campos($sV['tipo']);

      $orden = '';
      if (isset($MObjeto->orden)) {
        $orden = $MObjeto->orden;
      }
      $accion = '';
      if (isset($sV['accion'])) {
        $accion = 'consulta';
      }
      if (count($arr) > 0) {
        $sTipo = 'combo';
        $this->php[$orden][++$this->param] = array('id' => $sPre . $sC, 'tipo' => $sTipo, 'etiqueta' => $sV['comentario'], 'elementos' => $arr, 'accion' => $accion);
      } else {
        if (isset($sV['visible'])) {
          $this->php[$orden][++$this->param] = array('id' => $sPre . $sC, 'tipo' => $sTipo, 'etiqueta' => $sV['comentario'], 'oculto' => 1, 'accion' => $accion);
        } else {
          $this->php[$orden][++$this->param] = array('id' => $sPre . $sC, 'tipo' => $sTipo, 'etiqueta' => $sV['comentario'], 'accion' => $accion);
        }
      }

      if (isset($sV['clave'])) {
        $this->php[$orden][$this->param]['clave'] = 'index';
      }
    }//fin del struc['cmp']
    //Clases Primarias

    if ($bUnico == FALSE) {
      if (isset($MObjeto->hrd)) {
        foreach ($MObjeto->hrd as $sC => $sV) {
          $this->Generar($sV);
        }
      }
    }

    return true;
  }

  // --------------------------------------------------------------------------

  /**
   * Mapear Campos
   *
   * @access      public
   * @return      string Campos HTML
   */
  public function Definir_Campos($sCamp = '') {
    $sC = '';
    //Declaracion de Campo
    switch ($sCamp) {
      case 'INT' :
        $sC = 'texto';
        break;
      case 'VARCHAR' :
        $sC = 'texto';
        break;
      case 'CHAR' :
        $sC = 'texto';
        break;
      case 'DATE' :
        $sC = 'calendario';
        break;
      case 'DECIMAL' :
        $sC = 'texto';
        break;
      case 'TEXT' :
        $sC = 'textarea';
        break;
      default :
        $sC = 'texto';
        break;
    }
    return $sC;
  }

  // --------------------------------------------------------------------------

  /**
   * Creacion de un Objeto Formato Arreglo PHP
   *
   * @access      public
   * @return      array string
   */
  public function ObtenerPHP() {
    return $this->php;
  }

  // ---------------------------------------------------------------------------

  /**
   * Creacion de un Objeto Formato Arreglo JavaScript
   *
   * @access      public
   * @return      array string
   */
  public function ObtenerJSON() {
    $botones[1] = array('etiqueta' => 'Salvar O Actualizar', 'metodo' => 1, 'tipo' => 'submit');
    $iPos = 0;
    $json = array();

    if (isset($this->php['Principal'])) {
      foreach ($this->php['Principal'] as $Obj) {
        $json[++$iPos] = $Obj;
      }
    }
    foreach ($this->php as $Obj => $Val) {
      if ($Obj != 'Principal') {
        foreach ($Val as $O) {
          $json[++$iPos] = $O;
        }
      }
    }

    $this->json = array('campos' => $json, 'botones' => $botones, 'fconsulta' => 'Buscar', 'fguardar' => 'SalvarOActualizar');
    return json_encode($this->json);
  }

  // --------------------------------------------------------------------------

  /**
   * Imprimir Objeto Formato Arreglo JavaScript
   *
   * @access      public
   */
  public function ImprimirJSON() {
    print_r($this->ObtenerJSON());
  }

}

?>
